﻿using System;
using System.Data;
using System.Data.Linq;
using System.Linq;
using System.Collections.Generic;
using System.Web.UI.WebControls;
using Emporium_Web.Controls;
using Emporium_Web.Enums;
using Emporium_Web.DBML;
using System.Linq.Expressions;
using System.Web.Services;


namespace Emporium_Web
{
    public partial class PackingForm : System.Web.UI.Page
    {
        /// <summary>
        /// Es el código de Pedido de Compra
        /// </summary>
        private int PackingId
        {
            get { return ViewState["PackingId"] == null ? -1 : (int)ViewState["PackingId"]; }
            set { ViewState["PackingId"] = value; }
        }

        /// <summary>
        /// Contiene la operación que se realizará en el formulario
        /// </summary>
        private AccionesForm Operacion
        {
            get { return ViewState["Operation"] == null ? AccionesForm.Consultar : (AccionesForm)ViewState["Operation"]; }
            set { ViewState["Operation"] = value; }
        }

        /// <summary>
        /// Es el código del Detalle Seleccionado
        /// </summary>
        private int DetalleId
        {
            get { return Session["DetalleId"] == null ? -1 : (int)Session["DetalleId"]; }
            set { Session["DetalleId"] = value; }
        }

        /// <summary>
        /// Es el código del Cliente Seleccionado
        /// </summary>
        private int ClienteId
        {
            get { return Session["ClienteId"] == null ? -1 : (int)Session["ClienteId"]; }
            set { Session["ClienteId"] = value; }
        }


        /// <summary>
        /// Listado de proporciones.
        /// </summary>
        private List<PR_PackingEstilo> PackingEstiloTemp
        {
            get
            {
                return Session["PackingEstiloTemp"] == null ? null : (List<PR_PackingEstilo>)Session["PackingEstiloTemp"];
            }
            set
            {
                Session["PackingEstiloTemp"] = value;
            }
        }       

        protected void Page_Init(object sender, EventArgs e)
        {

        }

        protected void Page_Load(object sender, EventArgs e)
        {
            warningMessage.Visible = false;
            errorMessage.Visible = false;

            try
            {              
                if (!IsPostBack)
                {
                    errorMessage.Visible = false;

                    Master.ActualizaMenu(MenuPrincipal.Produccion, (int)MenuProduccion.PackingList);
                    Master.AgregarBreadcrumb("Packing List", "#", true);
                    Master.AgregarBreadcrumb("Listado", "PackingList.aspx", false);

                    int packingId = 0;

                    if (Request.QueryString["PackingId"] != null && Int32.TryParse(Request.QueryString["PackingId"], out packingId))
                    {
                        this.PackingId = packingId;
                    }
                    else
                    {
                        this.PackingId = -1;
                    }
                    PackingEstiloTemp = new List<PR_PackingEstilo>();                    
                    EstablecerComportamiento();
                }               
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        /// <summary>
        /// Prepara el formulario para la operación que se haya elegido (Agregar, Modificar o Consultar)
        /// </summary>
        private void EstablecerComportamiento()
        {
            int accion = 0;

            if (Request.QueryString["Operacion"] != null && Int32.TryParse(Request.QueryString["Operacion"].ToString(), out accion))
            {
                switch (accion)
                {
                    case (int)AccionesForm.Consultar:
                        this.Operacion = AccionesForm.Consultar;
                        Master.AgregarBreadcrumb("Consultar", "#", false);
                        CargarPacking();
                        DeshabilitarControles();
                        btnGrabar.Visible = false;
                        break;
                    case (int)AccionesForm.Modificar:
                        this.Operacion = AccionesForm.Modificar;
                        Master.AgregarBreadcrumb("Modificar", "#", false);
                        CargarPacking();
                        break;
                    default:
                        this.Operacion = AccionesForm.Adicionar;
                        Master.AgregarBreadcrumb("Adicionar", "#", false);
                        txtFechaRegistro.Text = DateTime.Now.ToShortDateString();                        
                        CargarPackingEstilos();                        
                        break;
                }
            }
        }

        private void CargarPacking()
        {
            TablasDataContext database = new TablasDataContext();

            var packingList = database.PR_PackingList.FirstOrDefault(c => c.PacLis_Id == this.PackingId);            

            txtCodigo.Text = (packingList.PacLis_Id).ToString("00000");            
            txtFechaRegistro.Text = packingList.PacLis_Fecha.ToShortDateString();
            txtEstado.Text = packingList.PacLis_Estado == 'A' ? "ABIERTO" : "CERRADO";
            txtCliente.Text = database.TG_Cliente.FirstOrDefault(c => c.Id == packingList.Cliente_Id).Nombre;
            txtDescripcion.Text = packingList.PacLis_Descripcion;
            txtDespacho.Text = (packingList.PacLis_Despacho).ToString("00000");
            PedidoCompraSearch1.CodigoSeleccionado = (packingList.PedCom_Id);

            this.ClienteId = packingList.Cliente_Id;
            CargarDireccion();
            ddlDireccion.SelectedValue = packingList.CliDir_Id.ToString();
            
            ListarPackingEstilos();
            CargarPackingEstilos();            
        }

        private void DeshabilitarControles()
        {
            txtDescripcion.Enabled = false;
            txtDespacho.Enabled = false;
            ddlDireccion.Enabled = false;
            gvEstilos.ShowFooter = false;
        }

        protected void btnGrabar_Click(object sender, EventArgs e)
        {
            try
            {
                Grabar();
            }
            catch (Exception ex)
            {
                lblErrorMessage.Text = ex.Message;
                errorMessage.Visible = true;
            }
        }

        protected void btnAtras_Click(object sender, EventArgs e)
        {
            Response.Redirect("PackingList.aspx");
        }

        private void Grabar()
        {
            switch (this.Operacion)
            {
                case AccionesForm.Adicionar:
                    Insertar();
                    break;
                case AccionesForm.Modificar:
                    Actualizar();
                    break;
                default:
                    lblErrorMessage.Text = Resources.MensajesValidacion.InvalidOperation;
                    errorMessage.Visible = true;
                    break;
            }
        }

        private void Insertar()
        {
            try
            {
                string strResultado = ValidaDatos();
                if (strResultado != string.Empty)
                {
                    lblWarningMessage.Text = strResultado;
                    warningMessage.Visible = true;
                    return;
                }

                TablasDataContext database = new TablasDataContext();

                //Cargar Cabecera.
                PR_PackingList packingList = new PR_PackingList();               
                packingList.PacLis_Estado = 'A';                
                packingList.PacLis_Fecha = DateTime.Now.Date;              
                packingList.PedCom_Id = PedidoCompraSearch1.CodigoSeleccionado;
                packingList.PacLis_Despacho = 1;
                packingList.PacLis_Descripcion = txtDescripcion.Text;
                packingList.Cliente_Id = this.ClienteId;
                packingList.CliDir_Id = Convert.ToInt32(this.ddlDireccion.SelectedValue);

                //Se carga el detalle.                           

                //Se carga el detalle.
                foreach (var packingEstilo in PackingEstiloTemp)
                {
                    PR_PackingEstilo nuevoEstilo = new PR_PackingEstilo()
                    {
                        Estilo_Id = packingEstilo.Estilo_Id,
                        PacEst_Prendas = packingEstilo.PacEst_Prendas,
                        PacEst_Secuencia = packingEstilo.PacEst_Secuencia                        
                    };
                    packingList.PR_PackingEstilo.Add(nuevoEstilo);
                }

                database.PR_PackingList.InsertOnSubmit(packingList);
                database.SubmitChanges();
                Response.Redirect("PackingList.aspx");
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private void Actualizar()
        {
            try
            {
                string strResultado = ValidaDatos();
                if (strResultado != string.Empty)
                {
                    lblWarningMessage.Text = strResultado;
                    warningMessage.Visible = true;
                    return;
                }

                TablasDataContext database = new TablasDataContext();
                database.DeferredLoadingEnabled = false;

                //Cargar Cabecera.
                PR_OrdenCorte orden = database.PR_OrdenCorte.FirstOrDefault(c => c.OrdCor_Id == this.PackingId);

                //Cargar Cabecera.                                
                orden.OrdCor_Estado = 'R';
                orden.OrdCor_FechaRegistro = DateTime.Now.Date;               

                //Se eliminan los detalles

              

                //Se carga el detalle.               

                database.SubmitChanges();
                Response.Redirect("PackingList.aspx");
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private string ValidaDatos()
        {
            string strResultado = string.Empty;

            if (PackingEstiloTemp.Count == 0)
                return "Ingrese Estilos";

            return string.Empty;
        }

        #region Datos Generales

        protected void PedidoCompraSearch_Seleccionado(object sender, EventArgs e)
        {
            TablasDataContext database = new TablasDataContext();

            if (PedidoCompraSearch1.CodigoSeleccionado > 0)
            {
                var pedidoCompra = database.CO_PedidoCompra.FirstOrDefault(c => c.PedCom_Id == PedidoCompraSearch1.CodigoSeleccionado);
                if (pedidoCompra != null)
                {
                    txtCliente.Text = pedidoCompra.TG_Cliente.Nombre;
                    ClienteId = pedidoCompra.Cliente_Id;
                    CargarDireccion();
                    CargarPackingEstilos();
                }
            }
        }

        private void CargarDireccion()
        {
            TablasDataContext db = new TablasDataContext();
            var listado = from direccion in db.TG_ClienteDireccion
                          where direccion.ClienteId == this.ClienteId
                          select direccion;

            this.ddlDireccion.DataSource = listado;
            this.ddlDireccion.DataTextField = "Descripcion";
            this.ddlDireccion.DataValueField = "Id";
            this.ddlDireccion.DataBind();

            ddlDireccion.Enabled = listado.Count() > 0;
        }
        #endregion


        #region Estilo
        private void ListarPackingEstilos()
        {
            TablasDataContext database = new TablasDataContext();

            var listaEstilos = from estilos in database.PR_PackingEstilo
                                    where estilos.PacLis_Id == this.PackingId
                                    select estilos;

            PackingEstiloTemp = listaEstilos.ToList();
        }

        private void CargarPackingEstilos()
        {
            if (PackingEstiloTemp.Count() > 0)
            {
                gvEstilos.DataSource = PackingEstiloTemp;
                gvEstilos.DataBind();

               //this.TotalPorcion = PackingEstiloTemp.Sum(c => c.PacEst_Prendas);
            }
            else
            {
                gvEstilos.DataSource = new List<PR_PackingEstilo>() { new PR_PackingEstilo() };
                gvEstilos.DataBind();
                gvEstilos.SelectedIndex = -1;

                for (int i = 0; i < gvEstilos.Rows[0].Cells.Count; i++)
                {
                    gvEstilos.Rows[0].Cells[i].Text = "";
                }
            }

            CargarEstilos();
        }

        private void CargarEstilos()
        {
            TablasDataContext database = new TablasDataContext();

            List<DE_Estilo> lstEstilos = new List<DE_Estilo>();

            var listarQuery = from estilos in database.CO_PedidoEstilo
                              where estilos.PedCom_Id == this.PedidoCompraSearch1.CodigoSeleccionado
                              select estilos;

            foreach (var item in listarQuery)
                if (!lstEstilos.Exists(c => c.Id == item.Estilo_Id))
                {
                    lstEstilos.Add(new DE_Estilo()
                    {
                        Id = item.Estilo_Id,
                        Descripcion = item.DE_Estilo.Descripcion
                    });
                }


            DropDownList ddlEstiloNew = ((DropDownList)gvEstilos.FooterRow.FindControl("ddlEstiloNew"));
            ddlEstiloNew.DataSource = lstEstilos.ToList();
            ddlEstiloNew.DataValueField = "Id";
            ddlEstiloNew.DataTextField = "Descripcion";
            ddlEstiloNew.DataBind();
            ddlEstiloNew.Items.Insert(0, (new ListItem("--SELECCIONE--", "0")));
            ddlEstiloNew.SelectedValue = "0";
        }

        protected void ddlEstilo_SelectedIndexChanged(object sender, EventArgs e)
        {
            TablasDataContext database = new TablasDataContext();
            DropDownList ddlEstiloNew = ((DropDownList)gvEstilos.FooterRow.FindControl("ddlEstiloNew"));
            Label lblClienteNew = ((Label)gvEstilos.FooterRow.FindControl("lblClienteNew"));

            if (PackingEstiloTemp.Count() == 0)
            {
                for (int i = 0; i < gvEstilos.Rows[0].Cells.Count; i++)
                {
                    gvEstilos.Rows[0].Cells[i].Text = "";
                }
            }

            var estilo = database.CO_PedidoEstilo.FirstOrDefault(c=>c.PedCom_Id == this.PedidoCompraSearch1.CodigoSeleccionado && c.Estilo_Id == Convert.ToInt32(ddlEstiloNew.SelectedValue));
            if (estilo != null)
            {
                lblClienteNew.Text = estilo.PedEst_CodigoCliente;
            }
        }

        #endregion
        private void ActualizarSeleccionGrilla(GridView gv)
        {
            if (gv.SelectedIndex > -1)
                foreach (GridViewRow row in gv.Rows)
                {
                    if (row.Cells[0].Controls.Count > 0)
                    {
                        ImageButton img = (ImageButton)row.Cells[0].Controls[0];
                        if ((row.RowIndex == gv.SelectedIndex))
                        {
                            img.ImageUrl = @"~/images/selected.png";
                        }
                        else
                        {
                            img.ImageUrl = @"~/images/unselected.png";
                        }
                    }
                }
        }

        protected void gvEstilos_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                if (e.CommandName.Equals("Insert"))
                {
                    DropDownList ddlEstiloNew = (DropDownList)gvEstilos.FooterRow.FindControl("ddlEstiloNew");
                    TextBox txtPrendasNew = (TextBox)gvEstilos.FooterRow.FindControl("txtPrendasNew");

                    int estilo = Convert.ToInt32(ddlEstiloNew.SelectedValue);
                    int prendas = Convert.ToInt32(txtPrendasNew.Text); ;

                    if (PackingEstiloTemp.Exists(c => c.Estilo_Id == Convert.ToInt32(ddlEstiloNew.SelectedValue)))
                    {
                        lblWarningMessage.Text = "Estilo seleccionado ya existe en el listado";
                        warningMessage.Visible = true;
                        return;
                    }

                    TablasDataContext database = new TablasDataContext();
                    var objEstilo = database.DE_Estilo.FirstOrDefault(c=>c.Id == estilo);                    

                    PackingEstiloTemp.Add(new PR_PackingEstilo()
                    {
                        PacEst_Secuencia = PackingEstiloTemp.Count + 1,
                        Estilo_Id = Convert.ToInt32(ddlEstiloNew.SelectedValue),
                        PacEst_Prendas = prendas,
                        DE_Estilo = objEstilo 
                    });

                    CargarPackingEstilos();
                }
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        protected void gvEstilos_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                TablasDataContext database = new TablasDataContext();
                var packingEstilo = (PR_PackingEstilo)(e.Row.DataItem);                
                Label lblCliente = (Label)e.Row.FindControl("lblCliente");

                var objEstilo = database.CO_PedidoEstilo.FirstOrDefault(c => c.PedCom_Id == this.PedidoCompraSearch1.CodigoSeleccionado && c.Estilo_Id == packingEstilo.Estilo_Id);
                if (objEstilo != null)
                {
                    lblCliente.Text = objEstilo.PedEst_CodigoCliente;
                }
            }
        }

        [WebMethod]
        public static void ActualizarPrendas(int id, string cantidad)
        {
            if (!string.IsNullOrEmpty(cantidad))
            {
                PackingForm pagina = new PackingForm();

                var estilos = (List<Emporium_Web.DBML.PR_PackingEstilo>)pagina.Session["PackingEstiloTemp"];

                var estiloDetalle = estilos.Find(c => c.PacEst_Secuencia == id);
                estiloDetalle.PacEst_Prendas = Convert.ToInt32(cantidad);
            }
        }

        protected void gvEstilos_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            try
            {
                int secuencia = Convert.ToInt32(e.Keys["PacEst_Secuencia"]);
                var proporcion = PackingEstiloTemp.Find(c => c.PacEst_Secuencia == secuencia);

                PackingEstiloTemp.Remove(proporcion);

                for (int i = 0; i < PackingEstiloTemp.Count; i++)
                    PackingEstiloTemp[i].PacEst_Secuencia = i + 1;

                CargarPackingEstilos();
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }
    }
}